package com.huaxin.hxmoduleworkorder.service.impl;

import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.huaxin.hxmoduleworkorder.common.enums.InspectionOrderItemResultStatus;
import com.huaxin.hxmoduleworkorder.models.InspectionOrderItem;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class AIGenerateService {

    @Value("${dashscope.api-key}")
    private String apiKey;

    /**
     * 根据巡检工单项列表生成 AI 分析建议
     *
     * @param items 巡检项列表
     * @return AI 生成的分析建议（纯文本）
     */
    public String generateAiSuggestion(List<InspectionOrderItem> items) {
        if (items == null || items.isEmpty()) {
            return "无巡检数据，无法生成分析建议。";
        }

        // Step 1: 构建提示词
        String prompt = buildPrompt(items);

        // Step 2: 创建客户端
        Generation gen = new Generation();

        // Step 3: 构建消息
        List<Message> messages = List.of(
                Message.builder()
                        .role(Role.SYSTEM.getValue())
                        .content("你是一名资深电力系统巡检专家，擅长分析设备运行状态并提出专业建议。")
                        .build(),
                Message.builder()
                        .role(Role.USER.getValue())
                        .content(prompt)
                        .build()
        );

        // Step 4: 构建请求参数
        GenerationParam param = GenerationParam.builder()
                .apiKey(apiKey)
                .model("qwen-plus")  // 可选：qwen-max（更强）、qwen-turbo（更快更便宜）
                .messages(messages)
                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
                .build();

        try {
            // Step 5: 同步调用
            GenerationResult result = gen.call(param);

            // Step 6: 提取回答
            return result.getOutput()
                    .getChoices()
                    .get(0)
                    .getMessage()
                    .getContent();

        } catch (NoApiKeyException e) {
            return "AI服务错误：API密钥未配置，请联系管理员。";
        } catch (InputRequiredException e) {
            return "输入数据缺失，无法分析。";
        } catch (ApiException e) {
            return "AI服务异常：" + e.getMessage();
        } catch (Exception e) {
            return "未知错误：" + e.getMessage();
        }
    }

    /**
     * 构建 AI 提示词（Prompt Engineering）
     */
    private String buildPrompt(List<InspectionOrderItem> items) {
        StringBuilder sb = new StringBuilder();
        sb.append("请作为电力系统高级巡检工程师，根据以下巡检工单项数据，生成一份专业、简洁的分析建议。\n\n");

        sb.append("【巡检数据】\n");
        int index = 1;
        for (InspectionOrderItem item : items) {
            sb.append(String.format("%d. %s\n", index++, item.getName()));
            sb.append(String.format("   类型: %s\n", item.getType()));
            sb.append(String.format("   标准值: %s\n", safeValue(item.getStandardValue())));
            sb.append(String.format("   实际值: %s\n", safeValue(item.getActualValue())));

            // 状态高亮
            InspectionOrderItemResultStatus status = item.getResultStatus();
            sb.append(String.format("   状态: %s", status != null ? status.getDisplayName() : "未检查"));

            // 异常项特别标注
            if (status == InspectionOrderItemResultStatus.ABNORMAL) {
                sb.append(" ⚠️");
            }
            sb.append("\n");

            // 备注
            if (hasText(item.getRemarks())) {
                sb.append(String.format("   备注: %s\n", item.getRemarks()));
            }

            // 照片数量
            if (item.getPhotoUrls() != null && !item.getPhotoUrls().isEmpty()) {
                sb.append(String.format("   照片: %d 张\n", item.getPhotoUrls().size()));
            }
            sb.append("\n");
        }

        // 异常项统计
        long abnormalCount = items.stream()
                .filter(i -> InspectionOrderItemResultStatus.ABNORMAL.equals(i.getResultStatus()))
                .count();

        sb.append(String.format("【统计】共 %d 项，其中异常 %d 项。\n\n", items.size(), abnormalCount));

        sb.append("【要求】\n");
        sb.append("1. 判断整体运行状态（正常 / 需关注 / 存在风险）\n");
        sb.append("2. 指出关键异常项及潜在风险（如有）\n");
        sb.append("3. 给出具体、可操作的处理建议\n");
        sb.append("4. 控制在 120 字以内，语言正式、简洁、专业\n");
        sb.append("5. 不要使用Markdown，只输出纯文本\n");

        return sb.toString();
    }

    // 工具方法
    private String safeValue(String value) {
        return hasText(value) ? value : "—";
    }

    private boolean hasText(String str) {
        return str != null && !str.trim().isEmpty();
    }
}